package com.itheima.d7_reflect_framework;

import com.itheima.d7_reflect_framework.bean.Cat;
import com.itheima.d7_reflect_framework.bean.Student;
import com.itheima.d7_reflect_framework.bean.Teacher;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.lang.reflect.Field;

/**
 * 目标：提供一个通用框架，支持保存所有对象的具体信息。
 */
public class ReflectDemo {
    public static void main(String[] args) {
        Student s = new Student();
        s.setName("猪八戒");
        s.setClassName("西天跑路1班");
        s.setAge(1000);
        s.setHobby("吃，睡");
        s.setSex('男');

        Teacher t = new Teacher();
        t.setName("波仔");
        t.setSex('男');
        t.setSalary(6000);

        Student s2 = new Student("张三",'男',18,"JavaEE156","睡觉");

        Cat cat = new Cat();

        //需求：定义一个通用框架，支持保存任意类型对象的具体信息
//        saveObj(t);
//        saveObj(s2);
        saveObj(cat);
    }


    public static void saveObj(Object obj) {
        if (obj == null) {
            throw new RuntimeException("对象不能为空");
        }
        //保存对象中的字段信息到文件中去
        //1、先字段解析
        //1.1字节码对象
        Class<?> cls = obj.getClass();
        //1.2获取全部的字段
        Field[] fields = cls.getDeclaredFields();

        //2、使用IO流写到文件中去
        try (FileOutputStream fos = new FileOutputStream("day14junit-reflect-annotation-proxy-app/obj.txt",true);
             PrintStream ps = new PrintStream(fos)) {
            //类名
            ps.println("=========" + cls.getName() + "=========");
//            ps.println("=========" + cls.getSimpleName() + "=========");
            //遍历字段，将字段写到文件中
            for (Field field : fields) {
                //获取字段的名称、字段的值
                //暴力反射
                field.setAccessible(true);
                //获取名字和值
                String name = field.getName();
                Object value = field.get(obj);
                //name + value
                ps.println(name + " = " + value);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
